package ar.edu.utn.frgp.banco.business.Implements;

import java.util.Date;

import ar.edu.utn.frgp.banco.business.Interfaces.IntTransferenciasBusiness;
import ar.edu.utn.frgp.banco.dao.Implements.ImpCuenta;
import ar.edu.utn.frgp.banco.dao.Implements.ImpTransferencias;
import ar.edu.utn.frgp.banco.dao.Implements.ImpMovimientos;
import ar.edu.utn.frgp.banco.domain.Cuenta;
import ar.edu.utn.frgp.banco.domain.Movimiento;
import ar.edu.utn.frgp.banco.domain.Transferencia;

public class ImpTransferenciasBusiness implements IntTransferenciasBusiness {

	@Override
	public boolean CrearTransferencia(Integer id_cuenta_origen,
			Integer nro_cuenta_destino, Double monto) throws Exception {
		try{
			// Valido Cuenta Origen (que exista y que el saldo mas el descubierto cubran el monto de la transferencia
			Cuenta cuentaorigen = new Cuenta();
			ImpCuenta cuentadao = new ImpCuenta();
			cuentaorigen = cuentadao.TraerCuenta(id_cuenta_origen);
			
			if(cuentaorigen != null){ // La cuenta Origen existe
				Double disponible  = (double) 0;
				
				disponible = cuentaorigen.getDescubierto() + cuentaorigen.getSaldo();

				if (cuentaorigen.getTipoCuenta().equals(Cuenta.TIPOCUENTA_CAJAAHORRO)){
					if (disponible < monto){
						throw new Exception ("El monto a transferir supera el Saldo Disponible.");
					}
				}else{// Si es Caja de ahorro el monto tiene recargo del 0.6% poreso evalue el disponible con este interes
					if (disponible < (monto * 1.06)){
						throw new Exception ("El monto a transferir supera el Saldo Disponible.");
					}
				}
				//Valido Cuenta Destino
				Cuenta cuentadestino = new Cuenta();
				cuentadestino = cuentadao.TraerCuentaPorNro(nro_cuenta_destino);
				if(cuentadestino == null){ // La cuenta Destino No existe
					throw new Exception ("La cuenta Destino es Inexistente.");
				}
				
				//Genero la Transferencia
				//Nuevo registro en tabla Transferencias
				Transferencia transferencia = new Transferencia();
				ImpTransferencias transferenciasdao = new ImpTransferencias();
				
				transferencia.setFecha(new Date());
				transferencia.setId_cuentaDestino(cuentadestino.getID_Cuenta());
				transferencia.setId_cuentaOrigen(cuentaorigen.getID_Cuenta());
				transferencia.setMonto(monto);
				transferenciasdao.AltaTransferencia(transferencia);
				
				//Nuevo registro en tabla Movimientos (para debito)
				Movimiento movimientodebito = new Movimiento();
				ImpMovimientos movimientosdao = new ImpMovimientos();
				
				movimientodebito.setFecha(new Date());
				movimientodebito.setId_cuenta(cuentaorigen.getID_Cuenta());
				movimientodebito.setOrigen(movimientodebito.ORIGEN_TRANSFERENCIA);
				Double montototal;
				
				if (cuentaorigen.getTipoCuenta().equals(Cuenta.TIPOCUENTA_CAJAAHORRO)){
					montototal = monto;
					
				}else{// si es Cuenta Corriente le sumo el 0.06% de interes por el movimiento
					montototal = monto*1.06;
				}
				movimientodebito.setMonto(montototal);
				movimientodebito.setSaldoActual(cuentaorigen.getSaldo()-montototal);
				movimientodebito.setTipoMov(movimientodebito.TIPOMOVIMIENTO_EXTRACCION);
				movimientosdao.AltaMovimiento(movimientodebito);

				//Modifico el saldo de la cuenta Origen
				cuentaorigen.setSaldo(cuentaorigen.getSaldo()-montototal);
				cuentadao.ModiCuenta(cuentaorigen);
				
				//Nuevo registro en tabla Movimientos (para acreditacion)
				Movimiento movimientocredito = new Movimiento();
				
				movimientocredito.setFecha(new Date());
				movimientocredito.setId_cuenta(cuentadestino.getID_Cuenta());
				movimientocredito.setOrigen(movimientocredito.ORIGEN_TRANSFERENCIA);
				movimientocredito.setMonto(monto);
				movimientocredito.setSaldoActual(cuentaorigen.getSaldo()+montototal);
				movimientocredito.setTipoMov(movimientocredito.TIPOMOVIMIENTO_DEPOSITO);
				movimientosdao.AltaMovimiento(movimientocredito);
		
				
				//Modifico el saldo de la cueta Destino
				cuentadestino.setSaldo(cuentadestino.getSaldo()+monto);
				cuentadao.ModiCuenta(cuentadestino);
				
				return true;
			}else{
				throw new Exception("La cuenta de Origen es Inexistente.");
			}
		} catch (Exception e){
			throw new Exception(e.getMessage()); //ENVIO DE ECEPCIONES
		}
	}

}
